/**
* \file		Terrain.h
* \brief	Définit la structure des Terrains
* \details	C'est ici que sont définis la structure des terrains, ses
*		accesseurs, ses mutateurs. Les set ne devraient être utilisés
*		que lors du chargement initial des données du jeu (chargement
*		de partie/nouvelle partie).
*/

#ifndef TERRAIN_H
#define TERRAIN_H
/**
* \brief	Informations définissant un type de terrain donné.
* \details	Ces informations sont le nom du type de terrain, le nom de ce qui le représentera graphiquement (sans doute à remplacer par un sprite par la suite... à voir), s'il est cultivable, s'il est traversable (quand il ne contient pas de personnage ou autre) et s'il s'agit d'un terrain de surface (ou souterrain, ou indifféremment l'un ou l'autre) uniquement
*/

typedef struct
{
   char *nom;			/*!<Nom du type de terrain : chaîne de
				caractères. Terrains prévus initialement :
				sable, eau, terreSout, terreSurf, grotte. A
				noter que le nom de chaque terrain doit être
				unique et que c'est grâce à celui-ci que le
				terrain sera identifié */
   char *representation;	/*!<Nom de ce qui le représentera
				graphiquement (sans doute à remplacer par un
				sprite ou autre par la suite... à voir quand
				on en saura plus) */
   char cultivable;		/*!<Si le terrain est cultivable, 1 pour oui,
				0 pour non. Rangé dans un char pour pallier à
				l'inexistence des booléens. cultivable :
				terreSurf */
   char traversableSiVide;	/*!<Si le terrain est traversable quand il
				est "vide" terrains non traversables (1 si
				oui, sinon 0) */
   char terrainDeSurface;	/*!<Si le terrain est de surface ou
				souterrain. Terrains de surface (1) :
				terreSurf ; terrains de souterrain (2) :
				terreSout, grotte ; terrains pouvant être
				l'un ou l'autre (0) : eau, sable */
} Terrain;


/*========================== Gestion de la mémoire ==========================*/
/**
* \brief	Initialise une structure terrain
* \details	Met à NULL tous les Pointeurs, alloue de la mémoire pour les
*		tableaux de char, met toutes les valeurs de la structure
*		passée en argument à leur valeur par défaut (0).
* \param	terrain		Pointeur vers le terrain en question
*/
void initTerrain(Terrain *pterrain, char *nom, char *representation);

/**
* \brief	Crée un Terrain
* \details	Crée un terrain et l'initialise grâce à initTerrain.
* \param	nom		Chaîne de caractères : nom du terrain
* \param	representation	Chaîne de caractères : représentation du
*				terrain
* \return	Un Terrain
*/
Terrain creerTerrain(char *nom, char *representation);

/**
* \brief	Libère la mémoire allouée pour les tableaux du terrain
* \details	Met à NULL tous les Pointeurs, désalloue la mémoire réservée
*		initialement pour les tableaux de char, met toutes les
*		valeurs de la structure passée en argument à leur valeur par
*		défaut (0).
* \param	terrain		Pointeur vers le terrain en question
*/
void libereTerrain(Terrain *pterrain);

/**
* \brief	Détruit une structure terrain
* \details	Désalloue la mémoire réservée pour une structure terrain
*		donnée après avoir libéré ladite structure via la fonction
*		libereTerrain
* \param	terrain		Pointeur vers le terrain en question
*/
void detruireTerrain(Terrain *pterrain);

/*============================= Accesseurs =============================*/
/**
* \brief	Retourne le nom d'un terrain donné
* \return	Une chaîne de caractères
* \param	terrain		Pointeur vers le terrain en question
*/
char *getNomTerrain(const Terrain *pterrain);

/**
* \brief	Retourne le nom du fichier contenant la représentation du
		terrain
* \return	Une chaîne de caractères
* \param	terrain		Pointeur vers le terrain en question
*/
char *getRepresentationTerrain(const Terrain *pterrain);

/**
* \brief	Retourne la valeur indiquant si un terrain est cultivable (1
*		si oui, 0 si non)
* \param	terrain		Pointeur vers le terrain en question
* \return	Un caractère
*/
char getCultivableTerrain(const Terrain *pterrain);

/**
* \brief	Retourne la valeur indiquant si un terrain est traversable (1
*		si oui, 0 si non) quand il est vide
* \param	terrain		Pointeur vers le terrain en question
* \return	Un caractère
*/
char getTraversableTerrain(const Terrain *pterrain);

/**
* \brief	Retourne la valeur indiquant si un terrain est de surface (1
*		si oui, 2 si souterrain, 0 s'il peut être de surface ou
*		souterrain)
* \param	terrain		Pointeur vers le terrain en question
* \return	Un caractère
*/
char getTerrainDeSurface(const Terrain *pterrain);

/*============================== Mutateurs ==============================*/
/**
* \brief	Change le nom du terrain
* \details	Attribue un nouveau nom (donné) à un terrain donné
* \param	terrain		Pointeur vers le terrain en question
* \param	nouvNom		Une chaîne de caractères : nom à attribuer au
*				terrain donné
*/
void setNomTerrain(Terrain *pterrain, char *nouvNom);

/**
* \brief	Change le nom de ce qui représentera le terrain
* \details	Attribue un nouveau nom de fichier (image), fichier qui
*		contiendra la représentation du terrain pour l'interface.
* \param	terrain		Pointeur vers le terrain en question
* \param	adresseImage	Une chaîne de caractères : nom du fichier
*		contenant la représentation du terrain
*/
void setRepresentationTerrain(Terrain *pterrain, char *adresseImage);

/**
* \brief	Change la valeur indiquant si un terrain est cultivable
* \details	Attribue à la valeur "cultivable" d'un terrain donné 1 si le
*		terrain est cultivable, 0 s'il ne l'est pas.
* \param	terrain		Pointeur vers le terrain en question
* \param	valCultivable	Un caractère : 0 ou 1
*/
void setCultivableTerrain(Terrain *pterrain, char valCultivable);

/**
* \brief	Change la valeur indiquant si un terrain est traversable
* \details	Attribue à la valeur "traversableSiVide" d'un terrain donné 1 *		si le  terrain est traversable quand rien ni personne ne
*		l'occupe, 0 s'il ne l'est pas.
* \param	terrain		Pointeur vers le terrain en question
* \param	valTraversable	Un caractère : 0 ou 1
*/
void setTraversableTerrain(Terrain *pterrain, char valTraversable);

/**
* \brief	Change la valeur indiquant si un terrain est un terrain de
*		surface uniquement
* \details	Attribue à la valeur "terrainDeSurface" d'un terrain donné 1 *		si le  terrain n'est rencontrable que dans la couche
*		"surface" de la carte, 2 s'il s'agit d'un terrain souterrain,
*		0 s'il peut exister dans les souterrains comme à la surface.
* \param	terrain			Pointeur vers le terrain en question
* \param	valTerrainDeSurface	Un caractère : 0, 1 ou 2
*/
void setTerrainDeSurface(Terrain *pterrain, char valTerrainDeSurface);

/*========================== Fonctions autres ==========================*/
/**
* \brief	Compare le nom d'un terrain à un nom donné
* \details	Compare le nom d'un terrain vers lequel pointe le pointeur
*		passé en paramètre à un nom donné. Si ce sont les mêmes,
*		retourne 1, sinon retourne 0.
* \param	pterr1		Pointeur vers terrain
* \param	nomTerr		Chaîne de caractères, nom de terrain
*/
char cmpTerrainNom(const Terrain *pterr1, const char *nomTerr);

/*========================== Fonction de Test ==========================*/
/**
* \brief	Teste les différentes fonctions du module Terrrain
* \details	Teste les différentes fonctions du module Terrain en les
*		utilisant avec diverses valeurs plus ou moins probables
*/
void testTerrain();

#endif
